In [1]:
import pandas as pd
import altair as alt
import geopandas as gpd
alt.data_transformers.disable_max_rows()
Out[1]:
DataTransformerRegistry.enable('default')
In [2]:
pop_trends = pd.read_csv('population_trends.csv')
pop_trends.head()
Out[2]:
region year rate
0 Ukraine 1989 1.7
1 Ukraine 1990 0.5
2 Ukraine 1991 -0.8
3 Ukraine 1992 -2.0
4 Ukraine 1993 -3.5
In [3]:
ukraine = gpd.read_file('ukraine.json')
ukraine.head()
Out[3]:
GID_0 NAME_0 GID_1 NAME_1 VARNAME_1 NL_NAME_1 TYPE_1 ENGTYPE_1 CC_1 HASC_1 geometry
0 UKR Ukraine UKR.1_1 Cherkasy Cherkas'ka Oblast'|Cherkasskaya Oblast'|Cherkassy None Oblast' Region None UA.CK MULTIPOLYGON (((31.32614 48.74507, 31.31716 48...
1 UKR Ukraine UKR.2_1 Chernihiv Chernigov|Tschernigow None Oblast' Region None UA.CH MULTIPOLYGON (((33.09283 50.50966, 33.09261 50...
2 UKR Ukraine UKR.3_1 Chernivtsi Chernivets'ka Oblast'|Chernovitskaya Oblast'|C... None Oblast' Region None UA.CV MULTIPOLYGON (((24.93280 47.72794, 24.93301 47...
3 UKR Ukraine UKR.4_1 Crimea Crimée|Criméia|Krim|Krymskaya Respublika|Respu... None Autonomous Republic Autonomous Republic None UA.KR MULTIPOLYGON (((33.79291 44.39153, 33.79465 44...
4 UKR Ukraine UKR.5_1 Dnipropetrovs'k Dnipropetrovsk|Dniepropietrovsk|Dnjepropetrowsk None Oblast' Region None UA.DP MULTIPOLYGON (((33.93176 47.48407, 33.92332 47...
In [15]:
pop_trends = pop_trends[pop_trends['region'] != 'Ukraine']
pop_trends_last_year = {'region':[], 'year':[], 'rate':[]}

regions = list(set(pop_trends['region']))

for region in regions:
    temp = pop_trends[pop_trends['region']==region]
    temp = temp[temp['year'] == max(list(set(temp['year'])))]
    pop_trends_last_year['region'].append(list(temp['region'])[0])
    pop_trends_last_year['year'].append(list(temp['year'])[0])
    pop_trends_last_year['rate'].append(list(temp['rate'])[0])

pop_trends_last_year = pd.DataFrame.from_dict(pop_trends_last_year)
pop_trends_last_year.head()
Out[15]:
region year rate
0 Volyn 2019 -2.8
1 Odesa 2019 -5.1
2 Ternopil' 2019 -6.6
3 Transcarpathia 2019 -2.0
4 Vinnytsya 2019 -7.9
In [16]:
base = alt.Chart(ukraine).mark_geoshape(fill = 'lightgray', stroke = 'white', strokeWidth = 1
).project().properties( 
    title = 'Рівень приросту / скорочення населення України за 2019 рік'
)
In [22]:
select_region = alt.selection_single(on = 'mouseover', 
                                     fields = ['NAME_1'], 
                                     nearest = False, empty = 'all')
In [23]:
coloring = alt.Chart(ukraine).transform_lookup(
    lookup = 'NAME_1',
    from_ = alt.LookupData(data = pop_trends_last_year, 
                           key = 'region', 
                          fields=['region','year', 'rate'])
).transform_calculate(
        Rate='isValid(datum.rate) ? datum.rate : "Undefined"'  
    ).project().mark_geoshape(stroke = 'lightgrey').encode(
    color = alt.Color('rate:Q', scale=alt.Scale(scheme='greens', reverse=True),
                     legend=alt.Legend(orient = 'bottom-left')),
        opacity=alt.condition(
        select_region,
        alt.value(0.8),
        alt.value(0.3)
    ),
    tooltip = [
        alt.Tooltip('region:N'),
        alt.Tooltip('Rate:Q')
    ]
).add_selection(select_region)
In [24]:
layered = alt.layer(base, coloring).encode(tooltip = [
        alt.Tooltip('NAME_1:N', title='region')
    ])
In [29]:
line_chart = alt.Chart(pop_trends).transform_lookup(
    lookup = 'region',
    from_ = alt.LookupData(data = ukraine, 
                           key = 'NAME_1', 
                          fields=list(ukraine.columns))
).mark_line().encode(
        x=alt.X('year:O'),
    y=alt.Y('rate:Q', title='Rate', scale = alt.Scale(domain = [-16, 8])),
    color=alt.condition(
        select_region,
        alt.Color('region:N', title='Region'),
        alt.ColorValue('lightgrey')
    ),
    tooltip=[alt.Tooltip('region:N'),
        alt.Tooltip('rate:Q')],
 
    strokeWidth=alt.condition(
        select_region,
        alt.value(2),
        alt.value(0.5)
    )
).add_selection(select_region).properties(
    title='Рівень приросту / скорочення населення за регіонами за всіма роками'
)
In [30]:
alt.hconcat(layered.properties(width = 550, height = 500), 
            line_chart.properties(width = 650, height = 500)
           ).properties(
    background = '#F9F9F9', padding = 25).configure_view(
    strokeWidth=0)
Out[30]:
In [ ]:
 
In [ ]: